/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.apli.haiam.comun.jsf.managed;

import com.apli.controladores.AplinfoFactoryBean;
import java.io.IOException;
import java.io.Serializable;
import java.util.Iterator;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmSistema;
import org.apli.haiam.ejb.interfaces.AdministradorLoginHaiam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Clase backing Bean que implementa el proceso iniciar sesión. <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfLogin implements Serializable{

 final Logger log = LoggerFactory.getLogger(JsfLogin.class);
    @EJB
    private AdministradorLoginHaiam admin;
    private String username;
    private String password;
    protected ResourceBundle bundle;

    /**
     * Constructor por defecto.
     */
    public JsfLogin() {
        bundle = ResourceBundle.getBundle("org.apli.jsf.message");
        cargarEjb();
        inicializar();
    }

    /**
     * Inicializa los datos miembros.
     */
    protected void inicializar() {
        username = "";
        password = "";
    }

    /**
     * Obtiene el objeto remoto ADMINISTRADOR.
     */
    protected void cargarEjb() {
        if (admin == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorLoginBeanHaiam";
                admin = (AdministradorLoginHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
//                try {
//                    admin.getFechaDb();
//                } catch (Exception e) {
//                }
            } catch (Exception e) {
                log.error("cargarEjb() {} - {} ", ejbPath, e.getMessage());
            }
        }
    }

    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    /**
     * Inicia una sesión en el sistema.
     *
     * @return null, retorna a la página invocada.
     */
    public String loginAction() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
        String remoteAddr = ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRemoteAddr();
        String host = ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRemoteHost();
        AdmSistema sistema = (AdmSistema) FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get("sistema");
        AdmSistema sistemaPrincipal = (AdmSistema) FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get("sistemaPrincipal");
        try {
            UsuarioAdmin user = (UsuarioAdmin) admin.iniciarSesion(username, password, remoteAddr, host, sistema, sistemaPrincipal, session.getId());
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("user");
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", user);
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("menu");
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("menu", user.getMenu());
            inicializar();
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "datosform").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.toString(), bundle.getString("msg.iniciarSesion.error")));
            log.error("loginAction() ERROR " + e);
            return null;
        }
        password = "";
        username = "";
        try {
            String url = (sistemaPrincipal.getHost() == null || sistemaPrincipal.getHost().length() < 3) ? "" : sistemaPrincipal.getHost();
            url += (sistemaPrincipal.getContextPath() == null || sistemaPrincipal.getContextPath().length() < 3) ? context.getExternalContext().getRequestContextPath() : sistemaPrincipal.getContextPath();
            url += "/index.jspx";
//            System.out.println(url);
            //context.getExternalContext().dispatch(url);
            String encodeURL = context.getExternalContext().encodeResourceURL(url);
            context.getExternalContext().redirect(encodeURL);
        } catch (IOException e) {
            log.error("loginAction() ERROR " + e);
        } finally {
            context.responseComplete();
        }
        return null;
    }

    /**
     * Cierra un asesión de trabajo.
     *
     * @param evt
     */
    public void logoutAction(ActionEvent evt) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().clear();
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            session.invalidate();
            FacesContext.getCurrentInstance().getExternalContext().redirect(FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath() + "/index.jspx");
        } catch (IOException e) {
            log.error("logoutAction() ERROR " + e);
        }
    }

    /**
     * Busca un componente JSF.
     *
     * @param c componente base
     * @param id el id del componente
     * @return el componente buscado
     */
    protected UIComponent findComponent(UIComponent c, String id) {
        if (id.equals(c.getId())) {
            return c;
        }
        Iterator<UIComponent> kids = c.getFacetsAndChildren();
        while (kids.hasNext()) {
            UIComponent found = findComponent(kids.next(), id);
            if (found != null) {
                return found;
            }
        }
        return null;
    }

    /**
     * Obtiene la contraseña.
     *
     * @return la contraseña
     */
    public String getPassword() {
        return password;
    }

    /**
     * Pone el valor de la contraseña en el campo respectivo.
     *
     * @param password la contraseña
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Obtiene el nombre de usuaario o login.
     *
     * @return el nombre de usuario
     */
    public String getUsername() {
        return username;
    }

    /**
     * Pone el nombre de usuario o login en el campo respectivo.
     *
     * @param username el nombre de usuario
     */
    public void setUsername(String username) {
        this.username = username;
    }
}
